/******************************************************
The interface to the operating system
process and thread control primitives

(c) 1995 Innobase Oy

Created 9/8/1995 Heikki Tuuri
*******************************************************/

#ifndef os0thread_h
#define os0thread_h

#include "univ.i"

/* Maximum number of threads which can be created in the program;
this is also the size of the wait slot array for MySQL threads which
can wait inside InnoDB */

#define OS_THREAD_MAX_N srv_max_n_threads

/* Possible fixed priorities for threads */
#define OS_THREAD_PRIORITY_NONE 100
#define OS_THREAD_PRIORITY_BACKGROUND 1
#define OS_THREAD_PRIORITY_NORMAL 2
#define OS_THREAD_PRIORITY_ABOVE_NORMAL 3

#ifdef __WIN__
typedef void *os_thread_t;
typedef ulint os_thread_id_t; /* In Windows the thread id
                              is an unsigned long int */
#else
typedef pthread_t os_thread_t;
typedef os_thread_t os_thread_id_t; /* In Unix we use the thread
                                    handle itself as the id of
                                    the thread */
#endif

/* Define a function pointer type to use in a typecast */
typedef void *(*os_posix_f_t)(void *);

/*******************************************************************
Compares two thread ids for equality. */

ibool os_thread_eq(
    /*=========*/
    /* out: TRUE if equal */
    os_thread_id_t a,  /* in: OS thread or thread id */
    os_thread_id_t b); /* in: OS thread or thread id */
/********************************************************************
Converts an OS thread id to a ulint. It is NOT guaranteed that the ulint is
unique for the thread though! */

ulint os_thread_pf(
    /*=========*/
    /* out: unsigned long int */
    os_thread_id_t a); /* in: thread or thread id */
/********************************************************************
Creates a new thread of execution. The execution starts from
the function given. The start function takes a void* parameter
and returns a ulint.
NOTE: We count the number of threads in os_thread_exit(). A created
thread should always use that to exit and not use return() to exit. */

os_thread_t os_thread_create(
/*=============*/
/* out: handle to the thread */
#ifndef __WIN__
    os_posix_f_t start_f,
#else
    ulint (*start_f)(void *),       /* in: pointer to function
                                    from which to start */
#endif
    void *arg,                  /* in: argument to start
                                function */
    os_thread_id_t *thread_id); /* out: id of the created
                                thread */
int os_thread_join(
    /*=============*/
    os_thread_id_t thread_id); /* in: id of the thread to join */
/*********************************************************************
Exits the current thread. */

void os_thread_exit(
    /*===========*/
    void *exit_value); /* in: exit value; in Windows this void*
                       is cast as a DWORD */
/*********************************************************************
Returns the thread identifier of current thread. */

os_thread_id_t os_thread_get_curr_id(void);
/*========================*/
/*********************************************************************
Returns handle to the current thread. */

os_thread_t os_thread_get_curr(void);
/*====================*/
/*********************************************************************
Advises the os to give up remainder of the thread's time slice. */

void os_thread_yield(void);
/*=================*/
/*********************************************************************
The thread sleeps at least the time given in microseconds. */

void os_thread_sleep(
    /*============*/
    ulint tm); /* in: time in microseconds */
/**********************************************************************
Gets a thread priority. */

ulint os_thread_get_priority(
    /*===================*/
    /* out: priority */
    os_thread_t handle); /* in: OS handle to the thread */
/**********************************************************************
Sets a thread priority. */

void os_thread_set_priority(
    /*===================*/
    os_thread_t handle, /* in: OS handle to the thread */
    ulint pri);         /* in: priority: one of OS_PRIORITY_... */
/**********************************************************************
Gets the last operating system error code for the calling thread. */

ulint os_thread_get_last_error(void);
/*==========================*/

#ifndef UNIV_NONINL
#include "os0thread.ic"
#endif

#endif
